package org.aliwo.syn;

/**
 * @author xuyayuan
 * @data 2021年06月12日
 * 通过多线程，模拟三个窗口卖100张票的问题
 * 使用同步方法 解决售票超卖的现象
 */
public class TicketThread {
    public static void main(String[] args) {

        SaleTicketRunnable saleTicketRunnable = new SaleTicketRunnable();
        Thread thread1 = new Thread(saleTicketRunnable);
        Thread thread2 = new Thread(saleTicketRunnable);
        Thread thread3 = new Thread(saleTicketRunnable);
        // 通过实现Runnable接口，会出现超卖的现象
        thread1.start(); // 启动售票线程
        thread2.start(); // 启动售票线程
        thread3.start(); // 启动售票线程
    }
}


class SaleTicketRunnable implements Runnable {
    private int ticketNum = 100; // 多个线程共享该票数变量
    private boolean loop = true;

    private synchronized void sellTicket() { // 同步方法，同一时刻，只能有一个线程执行sellTicket()方法
        if (ticketNum <= 0) {
            System.out.println("售票结束 !!!");
            loop = false;
            return;
        }

        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("窗口号 : " + Thread.currentThread().getName() + "卖出了一张票  "
                + " 剩余票数 = : " + (--ticketNum));
    }

    @Override
    public void run() {
        while (loop) {
            sellTicket(); // sellTicket是一个同步方法
        }
    }


}
